#ifndef _CK_AUDIO_H_
#define _CK_AUDIO_H_

#include "nui_things/mit/include/command_map.h"
#include "nui_things/mit/include/mit_rtos.h"
#include "nui_things/util/log_new.h"

#define KWS_ID_WWV_MASK 0x10000

#define MIT_ALGORITHM_TYPE 2

#define DROPING_START_MIC_INPUT 0

/* 初始化 
 * @param frame_sample_count 算法每帧处理采样数
 * @param vad_enable 是否开启本地VAD
 * @param wwv_enable 是否开启唤醒二次确认
 * @param vad_endpoint_ignore 是否不判断VAD尾点
 * @param vad_filter VAD过滤器类型
 * @param vad_kws_strategy 唤醒和识别VAD策略
 * @param kws_thres 唤醒VAD阈值
 * @param asr_thres 识别VAD阈值
 */
void audio_init(int frame_sample_count, int vad_enable, int wwv_enable, int vad_endpoint_ignore, int vad_filter, \
                int vad_kws_strategy, MitRtosVadThres *kws_thres, MitRtosVadThres *asr_thres);

/* 超时参数配置
 * @param vad_active_ms 语音断句时间
 * @param silence_ms    静默超时时间
 * @param max_ms        唤醒后总超时时间
 */
void audio_timeout_config(int vad_active_ms, int silence_ms, int max_ms);

/* 关键字识别 */
//int kws_process(short *signal_in);

/* 算法处理 16K */
/**
 * 语音识别处理
 * 
 * @param data_int 输入五路数据
 * @param sample_count 采样点数
 * @return  0:强制唤醒,预留给外部用 >1:识别到关键字  &KWS_ID_WWV_MASK>0: 需要云端唤醒确认
 */
int audio_process(short *data_in, int sample_count);

/* 设置唤醒提示音播放状态 */
/**
 * @param stat 0 - 停止播放，1 - 正在播放
 * @param buf_delay 当前ringbuffer中参数音频时间，单位ms
 * @param hw_delay 播放器播放延时，单位ms
 */
void audio_wakeup_voice_stat(int stat, int buf_delay, int hw_delay);

/* 获取算法状态 0:就绪  1:唤醒 2:等待结束 3:结束 */
#define AU_STATUS_READY 0
#define AU_STATUS_WAKE 1
#define AU_STATUS_WAIT 2
#define AU_STATUS_FINI 3
#define AU_STATUS_ASR  4

int audio_get_status();

/* 设置状态 */
int audio_set_status(int status);

/**
 * 获取vad状态
 * 
 * @return -1：安静 0：语音起点 1：语音结束 2：超时
 */
int audio_get_vad();

/* 获取vad数据 */
/**
 * 
 * @param data_len vad数据长度
 * @return !=NULL: 数据指针 NULL: 获取失败 
 */
char *audio_get_vad_data(int *data_len, int *finished);

/* 获取kws映射表 */
/**
 * 
 * @param void
 * @return !=NULL: kws map指针 NULL: 获取失败 
 */
command_word_handle *audio_get_kws_map(void);

/* 获取kws数据 */
/**
 * 
 * @param data_len kws数据长度
 * @return !=NULL: 数据指针 NULL: 获取失败 
 */
char *audio_get_kws_data(int *data_len);

/* 设置算法调试模式 */
/**
 * @param mode 调试模式，0: 关闭
 */
int audio_set_debug_level(unsigned int mode);

#endif
